/*
 * ColaBloqueante.cpp
 *
 */

#include "ColaBloqueante.h"

template <class T>
ColaBloqueante<T>::ColaBloqueante() {}

template <class T>
ColaBloqueante<T>::~ColaBloqueante() {}

template <class T>
T ColaBloqueante<T>::pop() {
	Lock lock(this->mutex);

	// La cola esperara hasta que haya al menos un elemento
	while (this->cola.empty()) {
		lock.wait();
	}
	T elem = this->cola.front();
	this->cola.pop();
	return elem;
}

template <class T>
void ColaBloqueante<T>::push(const T elem) {
	Lock lock(this->mutex);
	this->cola.push(elem);
	// Cuando alguien pushea, avisa al que esta esperando que ya puede popear
	lock.signal();
}

template <class T>
bool ColaBloqueante<T>::vacia() {
	Lock lock(this->mutex);
	return (this->cola.empty());
}

template class ColaBloqueante<std::string>;
